﻿//using System;
//using System.Collections.Generic;
//using System.Reflection;
//using System.Text;

//namespace SX.Utils
//{
//    public static class ReflectionExtensions
//    {
//        public static string Name(this Type type)
//        {
//#if COREFX
//            return type.GetTypeInfo().Name;
//#else
//            return type.Name;
//#endif
//        }

//        public static bool IsValueType(this Type type)
//        {
//#if COREFX
//            return type.GetTypeInfo().IsValueType;
//#else
//            return type.IsValueType;
//#endif
//        }
//        public static bool IsEnum(this Type type)
//        {
//#if COREFX
//            return type.GetTypeInfo().IsEnum;
//#else
//            return type.IsEnum;
//#endif
//        }
//        public static bool IsGenericType(this Type type)
//        {
//#if COREFX
//            return type.GetTypeInfo().IsGenericType;
//#else
//            return type.IsGenericType;
//#endif
//        }
//        public static bool IsInterface(this Type type)
//        {
//#if COREFX
//            return type.GetTypeInfo().IsInterface;
//#else
//            return type.IsInterface;
//#endif
//        }
//#if COREFX
//        public static IEnumerable<Attribute> GetCustomAttributes(this Type type, bool inherit)
//        {
//            return type.GetTypeInfo().GetCustomAttributes(inherit);
//        }

//        public static TypeCode GetTypeCode(Type type)
//        {
//            if (type == null) return TypeCode.Empty;
//            TypeCode result;
//            if (typeCodeLookup.TryGetValue(type, out result)) return result;

//            if (type.IsEnum())
//            {
//                type = Enum.GetUnderlyingType(type);
//                if (typeCodeLookup.TryGetValue(type, out result)) return result;
//            }
//            return TypeCode.Object;
//        }
//        static readonly Dictionary<Type, TypeCode> typeCodeLookup = new Dictionary<Type, TypeCode>
//        {
//            {typeof(bool), TypeCode.Boolean },
//            {typeof(byte), TypeCode.Byte },
//            {typeof(char), TypeCode.Char},
//            {typeof(DateTime), TypeCode.DateTime},
//            {typeof(decimal), TypeCode.Decimal},
//            {typeof(double), TypeCode.Double },
//            {typeof(short), TypeCode.Int16 },
//            {typeof(int), TypeCode.Int32 },
//            {typeof(long), TypeCode.Int64 },
//            {typeof(object), TypeCode.Object},
//            {typeof(sbyte), TypeCode.SByte },
//            {typeof(float), TypeCode.Single },
//            {typeof(string), TypeCode.String },
//            {typeof(ushort), TypeCode.UInt16 },
//            {typeof(uint), TypeCode.UInt32 },
//            {typeof(ulong), TypeCode.UInt64 },
//        };
//#else
//        public static TypeCode GetTypeCode(Type type)
//        {
//            return Type.GetTypeCode(type);
//        }
//#endif
//        public static MethodInfo GetPublicInstanceMethod(this Type type, string name, Type[] types)
//        {
//#if COREFX
//            var method = type.GetMethod(name, types);
//            return (method != null && method.IsPublic && !method.IsStatic) ? method : null;
//#else
//            return type.GetMethod(name, BindingFlags.Instance | BindingFlags.Public, null, types, null);
//#endif
//        }
//    }
//}
